﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2021 kingerrobot
// 版权所有。 
//
// 文件名：BWcsasrsNetOutPut
// 文件功能描述：
//
// 创建者：名字 (zzl)
// 时间：2021/12/21 14:52:23
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion
namespace KingerRobot.MexicoSailunMDC.SpiService;

public class BWcsAsrsNetOutPut : IWcsAsrsNetOutPut
{
    public List<WcsAsrsNetOutputGroup> GetAsrsNetOutputByForkInfo(List<CrnForkInfo> crnForkInfos)
    {
        // 可用堆垛机查找出库路线
        var result = GetEnableAsrsGroupList(crnForkInfos);

        return result;
    }

    public bool IsAsrsNetOutput(long ems, long targetLoc)
    {
        var db = Db.Default;
        var result = db.WcsAsrsNetOutputs
            .Where(t => t.TargetLoc == targetLoc && (t.EmsId == ems || t.EmsId2 == ems)).FirstOrDefault();
        return result is not null;
    }

    public List<POWcsAsrsNetOutput> GetAsrsNetOutputByTargetLoc(long targetLoc)
    {
        var db = Db.Default;
        var result = db.WcsAsrsNetOutputs
            .Where(t => t.TargetLoc == targetLoc)
            .ToList();
        return result;
    }

    public POWcsAsrsNetOutput GetFirstAsrsNetOutputByTargetLoc(long targetLoc) => GetAsrsNetOutputByTargetLoc(targetLoc).FirstOrDefault();

    public List<long> GetOutPutTranLoc()
    {
        var db = Db.Default;
        var result = db.WcsAsrsNetOutputs.Select(t => t.TranLoc.GetValueOrDefault()).Distinct().ToList();
        return result;
    }

    /// <summary>
    /// 有效堆区域  堆垛机
    /// </summary>
    /// <param name="startLoc"></param>
    /// <returns></returns>
    private List<WcsAsrsNetOutputGroup> GetEnableAsrsGroupList(List<CrnForkInfo> crnForkInfos)
    {
        // 堆垛机汇总货叉
        var crnForkGroup = crnForkInfos.Where(t=>t.IsEnable == true).GroupBy(t => t.CrnId).Select(t => new GroupForkInfo
        {
            CrnId = t.Key.Value,
            ForkInfos = t.ToList()
        });

        var db = Db.Default;
        var wcsAsrsNetOutputs = db.WcsAsrsNetOutputs.Where(t=>t.UseFlag == 1).ToList(); // 所有出库路线

        List<WcsAsrsNetOutputGroup> result = new();
        foreach (var netOutPut in wcsAsrsNetOutputs)
        {
            var crn = crnForkGroup.Where(t => t.CrnId == netOutPut.CrnId).FirstOrDefault();
            if (crn != null)
            {
                result.Add(new()
                {
                    WcsAsrsNetOutputs = netOutPut,
                    Count = crn.ForkInfos.Count(t => t.IsEnable == true),
                    CrnForkInfo = crn.ForkInfos.Where(t => t.IsEnable == true).ToList(),
                });
            }
        }
        return result.Where(t => t.Count > 0).ToList();
    }

    public POWcsAsrsNetOutput GetFirstAsrsNetOutputByStartLoc(long startLoc)
    {
        var db = Db.Default;
        var result = db.WcsAsrsNetOutputs
            .Where(t => t.TranLoc == startLoc && t.EmsId != 0 && t.EmsId2 != 0)
            .FirstOrDefault();
        return result;
    }

    public List<long> GetOutPutByTargetLocs(List<long> curingLocs)
    {
        var db = Db.Default;
        var result = db.WcsAsrsNetOutputs.AsEnumerable().Where(t=>t.UseFlag == 1).Join(curingLocs, f => f.TargetLoc, s => s, (f, s) => f).Select(t => t.CrnId.GetValueOrDefault()).ToList();

        return result;
    }

    class GroupForkInfo
    {
        public long CrnId { get; set; }
        public List<CrnForkInfo> ForkInfos { get; set; }
    }
}
